package lambda;

import java.io.File;
import java.io.FileFilter;

/**
 * JDK8推出的一个新特性:lambda表达式
 * 可以面向函数式编程。
 *
 * 给我们的直观感受就是可以用更精简的语法创建匿名内部类。
 * 语法:
 * (参数列表)->{
 *     方法体
 * }
 */
public class LambdaDemo {
    public static void main(String[] args) {
        //匿名内部类形式定义文件过滤器

        /*
            可以使用lambda表达式创建的接口要求只能有一个抽象方法!
            java中凡是可以使用lambda表达式创建的接口都使用了注解:@FunctionalInterface
         */
        //lambda表达式创建时省略了接口名和方法名
        FileFilter filter2 = (File file)->{
            return file.getName().startsWith(".");
        };

        //lambda表达式中参数的类型可以不写
        FileFilter filter3 = (file)->{
            return file.getName().startsWith(".");
        };

        //如果只有一个参数，那么参数列表的"()"可以忽略不写
        FileFilter filter4 = file->{
            return file.getName().startsWith(".");
        };

        /*
            如果方法体只有一句代码，那么"{}"可以忽略不写。
            如果这句代码含有return关键字，那么该关键字必须一同忽略。
         */
        FileFilter filter5 = file->file.getName().startsWith(".");





        File dir = new File(".");

        //以前使用匿名内部类的写法
//        File[] subs = dir.listFiles(new FileFilter() {
//            public boolean accept(File f) {
//                return f.getName().startsWith(".");
//            }
//        });

        //现在使用lambda表达式的写法
        File[] subs = dir.listFiles(f->f.getName().startsWith("."));

        System.out.println("子项个数:"+subs.length+"个");


    }
}
